#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import logging
import os
import sys
from datetime import datetime
from colorama import init, Fore, Style

# 初始化colorama以支持跨平台颜色输出
init(autoreset=True)

# 定义日志格式
LOG_FORMAT_FILE = '%(asctime)s - [ %(levelname)s ] - %(message)s'
LOG_FORMAT_CONSOLE = '%(message)s'

# 日志目录和文件配置
LOG_DIR = 'logs'
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
LOG_FILE = os.path.join(LOG_DIR, f'scp-batch-copy-{timestamp}.log')

# 确保日志目录存在
if not os.path.exists(LOG_DIR):
    os.makedirs(LOG_DIR)

# 创建logger实例
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.handlers.clear()  # 清除已存在的handler

# 创建文件handler - 记录所有INFO及以上级别的日志到文件
file_handler = logging.FileHandler(LOG_FILE, encoding='utf-8')
file_handler.setLevel(logging.INFO)
file_formatter = logging.Formatter(LOG_FORMAT_FILE)
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)


class ConsoleHandler(logging.Handler):
    """
    自定义控制台日志处理器，根据日志级别添加颜色并只显示带有特定标记的消息
    """
    def emit(self, record):
        """
        处理日志记录，根据日志级别添加颜色并输出到控制台
        
        参数:
            record: 日志记录对象
        """
        # 只显示带有特定标记的消息
        if hasattr(record, 'show_in_console') and record.show_in_console:
            try:
                # 根据日志级别添加颜色
                if record.levelname == 'INFO':
                    color = Fore.GREEN
                elif record.levelname == 'WARNING':
                    color = Fore.YELLOW
                elif record.levelname == 'ERROR':
                    color = Fore.RED
                else:
                    color = ''
                
                # 格式化并输出到控制台
                message = self.format(record)
                print(f"{color}{message}{Style.RESET_ALL}")
            except Exception:
                self.handleError(record)


# 创建控制台handler
console_handler = ConsoleHandler()
console_handler.setFormatter(logging.Formatter(LOG_FORMAT_CONSOLE))
logger.addHandler(console_handler)


# 提供方便使用的日志记录方法
def log_info_console(message):
    """
    记录信息级别的日志，同时输出到文件和控制台（控制台显示为绿色）
    
    参数:
        message: 要记录的消息内容
    """
    extra = {'show_in_console': True}
    logger.info(message, extra=extra)


def log_warning_console(message):
    """
    记录警告级别的日志，同时输出到文件和控制台（控制台显示为黄色）
    
    参数:
        message: 要记录的警告消息内容
    """
    extra = {'show_in_console': True}
    logger.warning(message, extra=extra)


def log_error_console(message):
    """
    记录错误级别的日志，同时输出到文件和控制台（控制台显示为红色）
    
    参数:
        message: 要记录的错误消息内容
    """
    extra = {'show_in_console': True}
    logger.error(message, extra=extra)


def log_info_file(message):
    """
    记录信息级别的日志，只输出到文件，不显示在控制台
    
    参数:
        message: 要记录的消息内容
    """
    extra = {'show_in_console': False}
    logger.info(message, extra=extra)


def log_warning_file(message):
    """
    记录告警级别的日志，只输出到文件，不显示在控制台
    
    参数:
        message: 要记录的消息内容
    """
    extra = {'show_in_console': False}
    logger.warning(message, extra=extra)

def get_log_file_path():
    """
    获取当前日志文件的路径
    
    返回:
        str: 日志文件的完整路径
    """
    return LOG_FILE